/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.centrala;

import java.util.AbstractList;
import java.util.ArrayList;
import java.util.List;
import javax.jws.WebService;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.xml.ws.RequestWrapper;
import javax.xml.ws.ResponseWrapper;

/**
 *
 * @author Broderson
 */
@WebService(serviceName = "HeadquartersWS")
public class HeadquartersWS {

    /**
     * Tymczasowe struktury, ktore pozniej beda zmienione
     */
    List<Category> categories;
    List<Product> products;
    List<Department> oddzialy;
    
    /*
     * Konstruktor WS'a, tutaj generujemy przykładowe dane dla response serwisów
     */
    public HeadquartersWS(){
        
        oddzialy = new ArrayList<Department>();
        
        oddzialy.add(new Department(0, "pierwszy", "url:pierwszego//oddzialu.com"));
        oddzialy.add(new Department(1, "drugi", "url:drugiego//oddzialu.ru"));
        oddzialy.add(new Department(2, "trzeci", "url:trzeciego//oddzialu.pl"));
        
        categories = new ArrayList<Category>();
        
        for (int i = 0; i < 10; i++) {
            Category tmp = new Category();
            tmp.setCategoryCode("" + i);
            tmp.setName("nazwaKategorii" + i);
            categories.add(tmp);
        }
        
        products = new ArrayList<Product>();
        
        for (int i = 0; i < 30; i++) {
            ProductStatus producStatus;
            int numberOfCategory = 0;
            ProductType producType = new ProductType();
            int oddzialID = 0;
            
            if(i<10){
                producStatus = ProductStatus.AVAIABLE;
                numberOfCategory = i;
                oddzialID = 0;
            }
            else if(i >= 10 && i<25){
                producStatus = ProductStatus.TEMPORARY_UNAVAIABLE;
            }
            else{
                producStatus = ProductStatus.UNAVAIABLE;
            }
            
            if(i>= 10 && i<20){
                numberOfCategory = i - 10;
                oddzialID = 1;
            }
            
            if(i>=20){
                oddzialID = 2;
                if(i%2 == 0){
                    numberOfCategory = 3;
                }
                else{
                    numberOfCategory = 7;
                }
            }
            
            if(i<20){
                producType = new ProductType("cd-audio", "Muzyka");
            }
            else if(i>=20 && i<26){
                producType = new ProductType("dvd-video", "Film na DVD");
            }
            else{
                producType = new ProductType("e-book", "E książka");
            }
            
            products.add(new Product("prod" + i, "nazwa prod" + i, (float)(i * 30), "Opis produktu jakiegos tam o numerze" + i, producStatus, categories.get(numberOfCategory), producType, oddzialID));
        }
        
    }
    
    @WebMethod(operationName = "hello")
    public String hello(@WebParam(name = "name") String txt) {
        return "Hello " + txt + " !";
    }
    
 //0. Lista kat - req pusty - res liste   
    /*
     * Zwraca: lista kategorii.
     */
    @WebMethod(operationName = "getCategoryList")
    public List<Category> getCategoryList() {
        return categories;
    }
 
//1. Liste produktów req-id oddzialu + opc po kat + opc zakres czasu od i do 
//- res -lista -aktualny stan 
    /*
     * Zwraca: listę sprzedanych produktów z danego oddziału
     * Przyjmuje: departmentID -> ID oddzialu
     * 
     * TO DO: Dodać parametry opcjonalne takie jak: kategoria przedmiotu i zakres dat
     */
    @WebMethod(operationName = "getProductList")
    public List<Product> Product_List(@WebParam(name = "departmentID") int departmentID) {
        List<Product> response = new ArrayList<Product>();
        
        for (int i = 0; i < products.size(); i++) {
            Product tmp = products.get(i);
            if(tmp.getOddzialID() == departmentID){
                response.add(tmp);
            }
        }
        
        return response;
    }

    /**
     * Jak poprzedni (patrz getCategoryList) z kategorią
     */
    @WebMethod(operationName = "getProductList_1")
    public List<Product> getProductList(@WebParam(name = "departmentID") int departmentID, @WebParam(name = "categoryCode") String categoryCode) {
        List<Product> response = new ArrayList<Product>();
        
        for (int i = 0; i < products.size(); i++) {
            Product tmp = products.get(i);
            if(tmp.getOddzialID() == departmentID && tmp.getCategory().getCategoryCode().compareTo(categoryCode) == 0){
                response.add(tmp);
            }
        }
        
        return response;
    }

    /**
     * Zwraca najlepiej sprzedające się produkty
     * Przyjmuje: oddzialID - ID oddziału z jakiego chcemy uzyskać dane
     * 
     * TO DO: Dodać parametry opcjonalne takie jak: kategoria przedmiotu, zakres dat i ilość wyników zwracanych
     */
    @WebMethod(operationName = "getBestSellingProd")
    public List<Product> getBestSellingProd(@WebParam(name = "departmentID") int departmentID) {
        List<Product> response = new ArrayList<Product>();
        
        int count = 3;
        
        for (int i = products.size()-1; i >= 0; i--) {
            Product tmp = products.get(i);
            if(tmp.getOddzialID() == departmentID && count > 0){
                response.add(tmp);
                count--;
            }
        }
        
        return response;
    }

    /**
     * Zwraca listę oddziałów
     */
    @WebMethod(operationName = "getDepartmentsList")
    public List<Department> getDepartmentsList() {
        
        return oddzialy;
    }

    /**
     * Web service operation
     */
    @WebMethod(operationName = "getBestDepartment")
    public Department getBestDepartment() {
        
        return oddzialy.get(2);
    }

    /**
     * Zwraca spis zamówień z danego oddziału
     * Przyjmuje: oddzialID -> ID oddziału
     * 
     * TO DO: Uzupełnić i dodać opcjonalne parametry
     */
    @WebMethod(operationName = "getOrderList")
    public String getOrderList(@WebParam(name = "departmentID") int departmentID) {
        //TODO write your implementation code here:
        return null;
    }

    /**
     * Pozwala zmienic status zamowienia
     * Przyjmuje: orderID -> ID zamowienia;
     *          newStatusOrder -> nowy status
     * 
     * TO DO: Uzupełnić
     */
    @WebMethod(operationName = "changeOrderStatus")
    public String changeOrderStatus(@WebParam(name = "orderID") String orderID, @WebParam(name = "newStatusOrder") OrderStatus newStatusOrder) {
        //TODO write your implementation code here:
        return null;
    }

    /**
     * Zwraca spis możliwych statusów
     */
    @WebMethod(operationName = "getOrderStatusList")
    public List<OrderStatus> getOrderStatusList() {
        List<OrderStatus> response = new ArrayList<OrderStatus>();
        
        response.add(OrderStatus.REPORTED);
        response.add(OrderStatus.UNAVAILABLE);
        response.add(OrderStatus.EXPECTANT);
        response.add(OrderStatus.COMPLETED);
        
        return response;
    }
        
    

}
